package nccloud.fct.ap.servlet;

import cn.hutool.core.lang.Assert;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yonyou.ucf.mdf.util.HttpClientUtil;
import nc.bs.dao.BaseDAO;
import nc.bs.framework.adaptor.IHttpServletAdaptor;
import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.framework.common.NCLocator;
import nc.bs.framework.server.ISecurityTokenCallback;
import nc.bs.wsdl.pub.DataInfoHelper;
import nc.itf.fct.ap.IApApprove;
import nc.itf.fct.ap.IApMaintain;
import nc.itf.fct.contract.IContractService;
import nc.itf.pub.dbservice.IDBService;
import nc.itf.uap.pf.IplatFormEntry;
import nc.itf.wsdl.pub.IDataType;
import nc.itf.wsdl.pub.IParameter;
import nc.itf.wsdl.pub.IWSDLLogger;
import nc.jdbc.framework.generator.IdGenerator;
import nc.jdbc.framework.processor.ColumnProcessor;
import nc.vo.fct.ap.entity.AggCtApVO;
import nc.vo.fct.ap.entity.CtApBVO;
import nc.vo.fct.ap.entity.CtApChangeVO;
import nc.vo.fct.ap.entity.CtApPlanVO;
import nc.vo.fct.ap.entity.CtApVO;
import nc.vo.pf.change.PfUtilBaseTools;
import nc.vo.pub.BusinessException;
import nc.vo.pub.ISuperVO;
import nc.vo.pub.VOStatus;
import nc.vo.pub.filesystem.NCFileNode;
import nc.vo.pub.filesystem.NCFileVO;
import nc.vo.pub.lang.UFBoolean;
import nc.vo.pub.lang.UFDate;
import nc.vo.pub.lang.UFDateTime;
import nc.vo.pub.lang.UFDouble;
import nccloud.bs.log.ImplLogVO;
import nccloud.fct.ap.utils.YhtHttpUtil;
import nccloud.pubitf.platform.attachment.IAttachmentService;
import nccloud.pubitf.platform.attachment.IFileStorageConst;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import uap.pub.fs.domain.basic.FileHeader;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

/**
 * 付款合同保存接口接口
 *
 * @Author ouyanggx
 * @Date 2025/8/7
 * */
public class FctApSave extends HttpServlet implements IHttpServletAdaptor {

    private BaseDAO baseDAO = null;

    private BaseDAO getBaseDAO() throws Exception
    {
        if (baseDAO == null)
        {
            baseDAO = new BaseDAO();
        }
        return baseDAO;
    }

    IContractService contractService = NCLocator.getInstance().lookup(IContractService.class);

    @Override
    public void doAction(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");/** 设置请求编码 */
        response.setContentType("text/html");/** 设置响应类型 */
        response.setCharacterEncoding("UTF-8");/** 设置响应编码 */

        UFDateTime serverTime = DataInfoHelper.getServerTime();// 服务器时间
        IWSDLLogger iLogger = NCLocator.getInstance().lookup(IWSDLLogger.class);// 日志接口

        JSONObject req = new JSONObject();
        JSONObject resp = new JSONObject();

        try {
            loginNcSystem();// 模拟登录
            String dataSource = request.getParameter("datasource");// 指定数据源
            if (StringUtils.isBlank(dataSource)) {
                throw new ServletException("datasource参数不能为空");
            }
            InvocationInfoProxy.getInstance().setUserDataSource(dataSource);
            InvocationInfoProxy.getInstance().setGroupId(IParameter.Default_PKGroup);

            // 接口数据
            String requestStr = readRequest(request);
            req =  JSONObject.parseObject(requestStr);

            /**
             * 合同处理
             */
            String action = req.getString("action");
            if("SAVE".equals(action)){
                AggCtApVO aggVO = buildSaveVO(req);

                doSave(aggVO, req, resp);
            }else if("CHANGE".equals(action)){
                AggCtApVO aggVO = buildChangeVO(req);

                doModify(aggVO, resp);
            }else if("FILE".equals(action)){
                AggCtApVO[] aggVO = queryVO(req);

                uploadFile(aggVO, req, resp);
            }else{
                resp.put("issuccess", "N");
                resp.put("msg", "无法识别传输的接口动作");
            }
        } catch (Exception e) {
            resp.put("issuccess", "N");
            resp.put("msg", e.getMessage());
        } finally {

            // 记录日志
            try {
                iLogger.saveLogger_RequiresNew(serverTime, req, resp);
            } catch (BusinessException e) {
                throw new RuntimeException(e);
            }
        }

        response.getWriter().print(resp);
    }

    /**
     * 封装VO
     */
    private AggCtApVO buildSaveVO(JSONObject jsonObject) throws BusinessException{
        JSONObject apObject = jsonObject.getJSONObject("apVO");
        String[] orgPKs =  DataInfoHelper.getOrgPKs(apObject.get("signorg"));
        String pk_org = orgPKs == null ? null : orgPKs[0];// 财务组织
        String pk_org_v = orgPKs == null ? null : orgPKs[1];// 财务组织版本

        // 承担部门
        String deptcode = "";
        String deptid = (String) apObject.get("deptid");
        if(StringUtils.isNotBlank(deptid)){
            deptcode = DataInfoHelper.getValueCode(deptid);
        }
        String[] deptPKs = DataInfoHelper.getDeptOrgPKs(deptcode, pk_org);
        String pk_dept = deptPKs == null ? null : deptPKs[0];// 部门
        String pk_dept_v = deptPKs == null ? null : deptPKs[1];// 部门版本

        String personnelid = DataInfoHelper.getPsndocPK(apObject.get("personnelid"));// 承办人
        String billmaker = DataInfoHelper.getUserPK(apObject.get("billmaker"));// 制单人
        String creater = DataInfoHelper.getUserPK(apObject.get("creatorId"));// 创建人
        String vbillcode = DataInfoHelper.formatString(apObject.get("vbillcode"));// 单据编号
        String ctname = DataInfoHelper.formatString(apObject.get("ctname"));// 合同名称
        String projectId = DataInfoHelper.getProjectPK(apObject.get("projectId"));// 合同名称
        String cvendorid = DataInfoHelper.getSupplierPK(apObject.get("vbdef1"));// 供应商
        UFDouble mny = DataInfoHelper.formatUFDouble2(apObject.get("norigpshamount"));// 合同金额
        UFDouble taxAmount = DataInfoHelper.formatUFDouble2(apObject.get("taxAmount"));// 税额
        UFDouble overrate = DataInfoHelper.formatUFDouble2(apObject.get("overrate"));// 超合同付款比例
        UFDouble taxmny = mny.sub(taxAmount);// 不含税金额

        UFDate valdate = DataInfoHelper.formatUFDate(apObject.get("valdate"));// 计划生效日期
        UFDate invallidate = DataInfoHelper.formatUFDate(apObject.get("invallidate"));// 计划终止日期
        UFDate subscribedate = DataInfoHelper.formatUFDate(apObject.get("subscribedate"));// 签字盖章日期
        String corigcurrencyid = DataInfoHelper.getCurrtypePK(apObject.get("corigcurrencyid"));// 币种
        UFBoolean openct = DataInfoHelper.formatUFBoolean(apObject.get("openct"));// 是否敞口合同
        UFDate ratedate = DataInfoHelper.formatUFDate(apObject.get("ratedate"));// 组织汇率来源日期

        String vbdef1 = DataInfoHelper.formatString(apObject.get("vbdef1"));// 供应商
        String vbdef2 = DataInfoHelper.formatString(apObject.get("vbdef2"));// 供应商银行账户
        String vbdef3 = DataInfoHelper.formatString(apObject.get("vbdef3"));// 开户行

        String vdef10 = DataInfoHelper.formatString(apObject.get("vdef10"));// 合同所属方	文本
        String vdef11 = DataInfoHelper.formatString(apObject.get("vdef11"));// 采购方式	文本
        String vdef12 = DataInfoHelper.formatString(apObject.get("vdef12"));// 合同执行部门	部门
        String vdef13 = DataInfoHelper.formatString(apObject.get("vdef13"));// 分管领导	人员
        String vdef14 = DataInfoHelper.formatString(apObject.get("vdef14"));// 合同性质	文本
        String vdef15 = DataInfoHelper.formatString(apObject.get("vdef15"));// 项目信息	文本
        String vdef16 = DataInfoHelper.formatString(apObject.get("vdef16"));// 签订类型	文本
        String vdef17 = DataInfoHelper.formatString(apObject.get("vdef17"));// 合同类型	文本
        String vdef18 = DataInfoHelper.formatString(apObject.get("vdef18"));// 合同期限	文本
        String vdef19 = DataInfoHelper.formatString(apObject.get("vdef19"));// 合同情况说明	文本
        String vdef20 = DataInfoHelper.formatString(apObject.get("vdef20"));// 报告提交日期	日期
        String vdef21 = DataInfoHelper.formatString(apObject.get("vdef21"));// 是否包含耗材或配件	文本
        String vdef22 = DataInfoHelper.formatString(apObject.get("vdef22"));// 基建项目信息	文本
        String vdef23 = DataInfoHelper.formatString(apObject.get("vdef23"));// 概算信息	文本
        String vdef24 = DataInfoHelper.formatString(apObject.get("vdef24"));// 开工日期	日期
        String vdef25 = DataInfoHelper.formatString(apObject.get("vdef25"));// 竣工日期	日期
        String vdef26 = DataInfoHelper.formatString(apObject.get("vdef26"));// 租赁标的物	文本
        String vdef27 = DataInfoHelper.formatString(apObject.get("vdef27"));// 租赁地点/姓名	文本
        String vdef28 = DataInfoHelper.formatString(apObject.get("vdef28"));// 发生年度	文本
        String vdef29 = DataInfoHelper.formatString(apObject.get("vdef29"));// 解决方式	文本
        String vdef30 = DataInfoHelper.formatString(apObject.get("vdef30"));// 维保时间	日期
        String vdef36 = DataInfoHelper.formatString(apObject.get("vdef36"));// 病情简介	文本
        String vdef37 = DataInfoHelper.formatString(apObject.get("vdef37"));// 收入类型	文本
        String vdef38 = DataInfoHelper.formatString(apObject.get("vdef38"));// 项目经费来源	文本
        String vdef39 = DataInfoHelper.formatString(apObject.get("vdef39"));// 合同属性	文本
        String vdef40 = DataInfoHelper.formatString(apObject.get("vdef40"));// 预算价	文本
        String vdef41 = DataInfoHelper.formatString(apObject.get("vdef41"));// 节约比率	文本
        String vdef42 = DataInfoHelper.formatString(apObject.get("vdef42"));// 预算合理性	文本
        String vdef43 = DataInfoHelper.formatString(apObject.get("vdef43"));// 维保费率	文本
        String vdef44 = DataInfoHelper.formatString(apObject.get("vdef44"));// 结算比率	文本
        String vdef45 = DataInfoHelper.formatString(apObject.get("vdef45"));// 预算承担部门	部门
        String vdef46 = DataInfoHelper.formatString(apObject.get("vdef46"));// 预算类型	文本
        String vdef47 = DataInfoHelper.formatString(apObject.get("vdef47"));// 收支项目	费用项目
        String vdef48 = DataInfoHelper.formatString(apObject.get("vdef48"));// 预算信息	自定义档案：yusuanxx_yql
        String vdef49 = DataInfoHelper.formatString(apObject.get("vdef49"));// 三级项目名称2	项目
        String vdef50 = DataInfoHelper.formatString(apObject.get("vdef50"));// 二级项目名称	项目
        String vdef51 = DataInfoHelper.formatString(apObject.get("vdef51"));// 一级项目名称	项目
        String vdef52 = DataInfoHelper.formatString(apObject.get("vdef52"));// 二级项目名称2	项目
        String vdef53 = DataInfoHelper.formatString(apObject.get("vdef53"));// 一级项目名称2	项目
        String vdef54 = DataInfoHelper.formatString(apObject.get("vdef54"));// 经费类型	自定义档案：HRP002_yql

        /******************************************************************************************/

        /**
         * 引用类型转换
         */

        // 合同执行部门
        String vdef12Str = "";
        if(StringUtils.isNotBlank(vdef12) && vdef12.contains("_")){
            String code = DataInfoHelper.getValueCode(vdef12);
            String[] vdef12Dept = DataInfoHelper.getDeptOrgPKs(code, pk_org);
            vdef12Str = vdef12Dept == null ? null : vdef12Dept[0];// 部门
        }

        // 分管领导
        String vdef13Str = DataInfoHelper.getPsndocPK(vdef13);

        // 预算承担部门
        String vdef45Str = "";
        if(StringUtils.isNotBlank(vdef45) && vdef45.contains("_")){
            String code = DataInfoHelper.getValueCode(vdef45);
            String[] vdef45Dept = DataInfoHelper.getDeptOrgPKs(code, pk_org);
            vdef45Str = vdef45Dept == null ? null : vdef45Dept[0];// 部门
        }

        // 收支项目
        String vdef47Str = DataInfoHelper.getInOutBusiclassPK(vdef47, pk_org);

        // 预算信息
        String vdef48Str = DataInfoHelper.getDefYUSUANXX(vdef48, pk_org);

        // 项目
        String vdef49Str = DataInfoHelper.getProjectPK(vdef49);
        String vdef50Str = DataInfoHelper.getProjectPK(vdef50);
        String vdef51Str = DataInfoHelper.getProjectPK(vdef51);
        String vdef52Str = DataInfoHelper.getProjectPK(vdef52);
        String vdef53Str = DataInfoHelper.getProjectPK(vdef53);

        // 经费类型
        String vdef54Str = DataInfoHelper.getDefHRP002(vdef54, pk_org);

        /**
         * <付款合同>表头
         */
        CtApVO apVO = new CtApVO();
        apVO.setStatus(VOStatus.NEW);// 新增
        apVO.setDr(0);// 删除标志
        apVO.setBlatest(UFBoolean.TRUE);// 是否最新版本
        apVO.setBordernumexec(UFBoolean.FALSE);// 已生成订单量作为合同执行
        apVO.setBtriatradeflag(UFBoolean.FALSE);// 三角贸易
        apVO.setCbilltypecode(IDataType.FCT_AP);// 单据类型
        apVO.setCcurrencyid(IParameter.Default_PKCurrtype);// 本币位
        apVO.setCorigcurrencyid(IParameter.Default_PKCurrtype);// 币种
        apVO.setCrececountryid(IParameter.Default_PKCountry);// 发货国家/地区
        apVO.setCsendcountryid(IParameter.Default_PKCountry);// 收货国家/地区
        apVO.setCtaxcountryid(IParameter.Default_PKCountry);// 报税货国家/地区

        apVO.setEmendenum(-1);// 修订枚举
        apVO.setFbuysellflag(2);// 购销类型
        apVO.setFstatusflag(0);// 合同状态 	0=自由;1=生效;2=审批中;3=审批通过;4=审批未通过;5=冻结;6=终止;7=提交;
        apVO.setIprintcount(0);// 打印次数
        apVO.setMountcalculation(0);// 计划金额计算方式 0=按比例计算;1=手工填写金额;
        apVO.setSaga_frozen(0);// 冻结状态
        apVO.setSaga_status(0);// 事务状态
        apVO.setVersion(new UFDouble(1));// 版本
        apVO.setNexchangerate(new UFDouble(1));// 折本汇率
        apVO.setOpenct(openct);// 是否敞口合同
        apVO.setEarlysign(UFBoolean.FALSE);// 期初标志
        apVO.setVtrantypecode(IDataType.TRANTYPE_AP);//合同类型编码

        apVO.setVbillcode(vbillcode);
        apVO.setCtname(ctname);// 合同名称
        apVO.setCtrantypeid(IParameter.Default_PKCtranType);// 合同类型
        apVO.setDbilldate(new UFDate());// 单据日期
        apVO.setValdate(valdate);// 计划生效日期
        apVO.setInvallidate(invallidate);// 计划终止日期
        apVO.setSubscribedate(subscribedate);// 签字盖章时间
        apVO.setCprojectid(projectId);
        apVO.setOverrate(overrate);// 超合同付款比例

        apVO.setCvendorid(cvendorid);// 供应商
        apVO.setCvendorid_v(cvendorid);// 供应商版本

        /**
         * <金额>
         */
        apVO.setNorigcopamount(new UFDouble(0));// 累计原币应付金额
        apVO.setNorigplanamount(new UFDouble(0));// 累计原币预付款金额
        apVO.setNorigpshamount(new UFDouble(0));// 累计原币付款金额
        apVO.setNorikpmny(new UFDouble(0));// 累计原币收票金额

        apVO.setNoriprepaymny(new UFDouble(0));// 预付款
        apVO.setNprepaymny(new UFDouble(0));// 本币预付款
        apVO.setNtotalcopamount(new UFDouble(0));// 累计本币应付金额
        apVO.setNtotalplanamount(new UFDouble(0));// 累计本币预付款金额
        apVO.setNtotalgpamount(UFDouble.ZERO_DBL);// 累计本币付款金额
        apVO.setNtotalastnum(UFDouble.ZERO_DBL);// 	总数量
        apVO.setNtotalorigmny(mny);// 原币价税合计
        apVO.setNtotaltaxmny(taxmny);// 本币价税合计

        apVO.setUnconfpayableorg(UFDouble.ZERO_DBL);// 未确认本币应付金额
        apVO.setUnconfpayableori(UFDouble.ZERO_DBL);// 未确认原币应付金额
        apVO.setUnconfpaymentorg(UFDouble.ZERO_DBL);// 未确认本币付款金额
        apVO.setUnconfpaymentori(UFDouble.ZERO_DBL);// 未确认原币付款金额

        /**
         * <组织>组
         */
        apVO.setOrganizer(pk_org);// 承办组织
        apVO.setOrganizer_v(pk_org_v);// 承办组织版本
        apVO.setPk_group(IParameter.Default_PKGroup);// 集团
        apVO.setPk_org(pk_org);// 财务组织
        apVO.setPk_org_v(pk_org_v);// 财务组织版本
        apVO.setSignorg(pk_org);// 签约组织
        apVO.setSignorg_v(pk_org_v);// 签约组织版本
        if(deptPKs != null){
            apVO.setDepid(pk_dept);// 申请部门
            apVO.setDepid_v(pk_dept_v);// 申请部门
        }
        apVO.setPersonnelid(personnelid);// 申请人

        /**
         * <其他>组
         */
        apVO.setCreationtime(new UFDateTime());// 创建时间
        apVO.setCreator(creater);// 创建人
        apVO.setBillmaker(billmaker);// 制单人
        apVO.setDmakedate(new UFDate());// 制单日期

        /**
         * <自定义>组
         */
        apVO.setVdef10(vdef10);// 合同所属方	文本
        apVO.setVdef11(vdef11);// 采购方式	文本
        apVO.setVdef12(vdef12Str);// 合同执行部门	部门
        apVO.setVdef13(vdef13Str);// 分管领导	人员
        apVO.setVdef14(vdef14);// 合同性质
        apVO.setVdef15(vdef15);// 项目信息	文本
        apVO.setVdef16(vdef16);// 签订类型	文本
        apVO.setVdef17(vdef17);// 合同类型	文本
        apVO.setVdef18(vdef18);// 合同期限	文本
        apVO.setVdef19(vdef19);// 合同情况说明	文本
        apVO.setVdef20(vdef20);// 报告提交日期	日期
        apVO.setVdef21(vdef21);// 是否包含耗材或配件	文本
        apVO.setVdef22(vdef22);// 基建项目信息	文本
        apVO.setVdef23(vdef23);// 概算信息	文本
        apVO.setVdef24(vdef24);// 开工日期	日期
        apVO.setVdef25(vdef25);// 竣工日期	日期
        apVO.setVdef26(vdef26);// 租赁标的物	文本
        apVO.setVdef27(vdef27);// 租赁地点/姓名	文本
        apVO.setVdef28(vdef28);// 发生年度	文本
        apVO.setVdef29(vdef29);// 解决方式	文本
        apVO.setVdef30(vdef30);// 维保时间	日期
//        apVO.setVdef31(vdef31);
//        apVO.setVdef32(vdef32);
//        apVO.setVdef33(vdef33);
//        apVO.setVdef34(vdef34);
        apVO.setVdef35(vdef10);// 合同所属方
        apVO.setVdef36(vdef36);// 病情简介	文本
        apVO.setVdef37(vdef37);// 收入类型	文本
        apVO.setVdef38(vdef38);// 项目经费来源	文本
        apVO.setVdef39(vdef39);// 合同属性	文本
        apVO.setVdef40(vdef40);// 预算价	    文本
        apVO.setVdef41(vdef41);// 节约比率	文本
        apVO.setVdef42(vdef42);// 预算合理性	文本
        apVO.setVdef43(vdef43);// 维保费率	文本
        apVO.setVdef44(vdef44);// 结算比率	文本
        apVO.setVdef45(vdef45Str);// 预算承担部门	部门
        apVO.setVdef46(vdef46);// 预算类型	文本
        apVO.setVdef47(vdef47Str);// 收支项目	费用项目
        apVO.setVdef48(vdef48Str);// 预算信息	自定义档案：yusuanxx_yql
        apVO.setVdef49(vdef49Str);// 三级项目名称2	项目
        apVO.setVdef50(vdef50Str);// 二级项目名称	项目
        apVO.setVdef51(vdef51Str);// 一级项目名称	项目
        apVO.setVdef52(vdef52Str);// 二级项目名称2	项目
        apVO.setVdef53(vdef53Str);// 一级项目名称2	项目
        apVO.setVdef54(vdef54Str);// 经费类型	自定义档案：HRP002_yql
//        apVO.setVdef55(vdef55);
        apVO.setVdef56(vdef11);// 采购方式
//        apVO.setVdef57(vdef57);
//        apVO.setVdef58(vdef58);
//        apVO.setVdef59(vdef59);

        /******************************************************************************************/

        JSONArray bodyVOArray = jsonObject.getJSONArray("bodyVO");
        if(bodyVOArray == null){

        }

        List<ISuperVO> superVOList = new ArrayList<>();
        if(bodyVOArray != null && bodyVOArray.size() > 0){
            for (int i = 0; i < bodyVOArray.size(); i++) {
                JSONObject bodyObject = bodyVOArray.getJSONObject(i);
                String crowno = DataInfoHelper.formatString(bodyObject.getString("crowno"));
                String pk_material = DataInfoHelper.formatString(bodyObject.getString("pk_material"));
                String pk_marbasclass = DataInfoHelper.formatString(bodyObject.getString("pk_marbasclass"));
                String castunitid = DataInfoHelper.formatString(bodyObject.getString("castunitid"));
                UFDouble nnum = DataInfoHelper.formatUFDouble2(bodyObject.get("nnum"));//数量
                UFDouble ntax = DataInfoHelper.formatUFDouble2(bodyObject.get("ntax"));//税额
                UFDouble nmny = DataInfoHelper.formatUFDouble2(bodyObject.get("nmny"));//无税金额
                UFDouble ntaxmny = DataInfoHelper.formatUFDouble2(bodyObject.get("ntaxmny"));//金额
                UFDouble ngtaxprice = DataInfoHelper.formatUFDouble2(bodyObject.get("ngtaxprice"));// 单价
                UFDouble ngprice = DataInfoHelper.formatUFDouble2(bodyObject.get("ngprice"));// 无税单价

                /**
                 * <付款合同>合同基本
                 */
                CtApBVO bodyVO = new CtApBVO();
                bodyVO.setStatus(VOStatus.NEW);// 新增
                bodyVO.setDr(0);// 删除标志
                bodyVO.setCrowno(crowno);// 行号
                bodyVO.setAttributeValue("ISPEALLOCED", UFBoolean.FALSE);
                bodyVO.setNnum(nnum);
                bodyVO.setNastnum(nnum);
                bodyVO.setNordnum(nnum);
                bodyVO.setNordsum(nnum);

                /**
                 * <金额>组
                 */
                bodyVO.setNcalcostmny(nmny);
                bodyVO.setNcaltaxmny(nmny);
                bodyVO.setNmny(ntaxmny);
                bodyVO.setNcopegpmny(new UFDouble(0));
                bodyVO.setNgprice(new UFDouble(0));
                bodyVO.setNgtaxprice(new UFDouble(0));

                bodyVO.setNorigmny(ntaxmny);
                bodyVO.setNorigtaxmny(nmny);
                bodyVO.setNoricopegpmny(new UFDouble(0));
                bodyVO.setNorigprice(new UFDouble(0));
                bodyVO.setNorigtaxprice(new UFDouble(0));
                bodyVO.setNorikpmny(new UFDouble(0));
                bodyVO.setNoriplangpmny(new UFDouble(0));
                bodyVO.setNoritotalgpmny(new UFDouble(0));

                bodyVO.setNtaxmny(ntaxmny);
                bodyVO.setNplangpmny(new UFDouble(0));
                bodyVO.setNqtorigprice(new UFDouble(0));
                bodyVO.setNqtorigtaxprice(new UFDouble(0));
                bodyVO.setNqtprice(new UFDouble(0));
                bodyVO.setNqttaxprice(new UFDouble(0));
                bodyVO.setNqtunitnum(new UFDouble(0));
                bodyVO.setNtax(new UFDouble(0));
                bodyVO.setNtaxrate(new UFDouble(0));
                bodyVO.setNtotalgpmny(new UFDouble(0));

                bodyVO.setUnconfpayableorg(UFDouble.ZERO_DBL);// 未确认本币应付金额
                bodyVO.setUnconfpayableori(UFDouble.ZERO_DBL);// 未确认原币应付金额
                bodyVO.setUnconfpaymentorg(UFDouble.ZERO_DBL);// 未确认本币付款金额
                bodyVO.setUnconfpaymentori(UFDouble.ZERO_DBL);// 未确认原币付款金额

                /**
                 * <组织>组
                 */
                bodyVO.setPk_group(IParameter.Default_PKGroup);// 集团
                bodyVO.setPk_financeorg(pk_org);// 财务组织
                bodyVO.setPk_financeorg_v(pk_org_v);// 财务组织版本
                bodyVO.setPk_org(pk_org);// 财务组织
                bodyVO.setPk_org_v(pk_org_v);// 财务组织版本

                superVOList.add(bodyVO);
            }
        }else{

            /**
             * <付款合同>合同基本
             */
            CtApBVO bodyVO = new CtApBVO();
            bodyVO.setStatus(VOStatus.NEW);// 新增
            bodyVO.setDr(0);// 删除标志
            bodyVO.setCrowno("1");// 行号
            bodyVO.setAttributeValue("ISPEALLOCED", UFBoolean.FALSE);
            bodyVO.setNnum(UFDouble.ZERO_DBL);
            bodyVO.setNastnum(UFDouble.ZERO_DBL);
            bodyVO.setNordnum(UFDouble.ZERO_DBL);
            bodyVO.setNordsum(UFDouble.ZERO_DBL);

            /**
             * <金额>组
             */
            bodyVO.setNcalcostmny(mny);
            bodyVO.setNcaltaxmny(mny);
            bodyVO.setNmny(taxmny);
            bodyVO.setNcopegpmny(new UFDouble(0));
            bodyVO.setNgprice(new UFDouble(0));
            bodyVO.setNgtaxprice(new UFDouble(0));

            bodyVO.setNorigmny(mny);
            bodyVO.setNorigtaxmny(mny);
            bodyVO.setNoricopegpmny(new UFDouble(0));
            bodyVO.setNorigprice(new UFDouble(0));
            bodyVO.setNorigtaxprice(new UFDouble(0));
            bodyVO.setNorikpmny(new UFDouble(0));
            bodyVO.setNoriplangpmny(new UFDouble(0));
            bodyVO.setNoritotalgpmny(new UFDouble(0));

            bodyVO.setNtaxmny(taxmny);// 不含税金额
            bodyVO.setNplangpmny(new UFDouble(0));
            bodyVO.setNqtorigprice(new UFDouble(0));
            bodyVO.setNqtorigtaxprice(new UFDouble(0));
            bodyVO.setNqtprice(new UFDouble(0));
            bodyVO.setNqttaxprice(new UFDouble(0));
            bodyVO.setNqtunitnum(new UFDouble(0));
            bodyVO.setNtax(taxAmount);// 税额
            bodyVO.setNtaxrate(new UFDouble(0));
            bodyVO.setNtotalgpmny(new UFDouble(0));

            bodyVO.setUnconfpayableorg(UFDouble.ZERO_DBL);// 未确认本币应付金额
            bodyVO.setUnconfpayableori(UFDouble.ZERO_DBL);// 未确认原币应付金额
            bodyVO.setUnconfpaymentorg(UFDouble.ZERO_DBL);// 未确认本币付款金额
            bodyVO.setUnconfpaymentori(UFDouble.ZERO_DBL);// 未确认原币付款金额

            /**
             * <组织>组
             */
            bodyVO.setPk_group(IParameter.Default_PKGroup);// 集团
            bodyVO.setPk_financeorg(pk_org);// 财务组织
            bodyVO.setPk_financeorg_v(pk_org_v);// 财务组织版本
            bodyVO.setPk_org(pk_org);// 财务组织
            bodyVO.setPk_org_v(pk_org_v);// 财务组织版本

            superVOList.add(bodyVO);
        }

        ISuperVO[] ctApBVO = null;
        if(CollectionUtils.isNotEmpty(superVOList)){
            ctApBVO = superVOList.toArray(new ISuperVO[superVOList.size()]);
        }else{
            Assert.isTrue(Boolean.FALSE,"获取合同明细行失败！");
        }

        /******************************************************************************************/

        JSONObject planObject = jsonObject.getJSONObject("planVO");
        Integer accountnum = DataInfoHelper.formatInteger(planObject.get("accountnum"));// 账期号
        String paymontype = DataInfoHelper.formatString(planObject.get("paymontype"));// 款项类型
        String vdef1 = DataInfoHelper.formatString(planObject.get("vdef1"));// 付款条件
        UFDouble vdef2 = DataInfoHelper.formatUFDouble(planObject.get("vdef2"));// 付款比例
        String vdef3 = DataInfoHelper.formatString(planObject.get("vdef3"));// 付款日期
        UFDouble vdef4 = DataInfoHelper.formatUFDouble2(planObject.get("vdef4"));// 计划付款金额
        String vdef5 = DataInfoHelper.formatString(planObject.get("vdef5"));// 是否质保金
        String vdef6 = DataInfoHelper.formatString(planObject.get("vdef6"));// 是否预付款

        /**
         * <付款合同>付款计划
         */
        CtApPlanVO planVO = new CtApPlanVO();
        planVO.setStatus(VOStatus.NEW);// 新增
        planVO.setDr(0);// 删除标志
        planVO.setAccountnum(accountnum);
        planVO.setAccountdate(0);
        planVO.setBegindate(new UFDate());
        planVO.setEnddate(new UFDate());
        planVO.setMoneytype(UFBoolean.FALSE);
        planVO.setPaymontype(IParameter.Default_PaymonType);
        planVO.setPaytype(UFBoolean.FALSE);

        planVO.setVdef1(vdef1);
        planVO.setVdef2(String.valueOf(vdef2));
        planVO.setVdef3(vdef3);
        planVO.setVdef4(vdef4.toString());
        planVO.setVdef5(vdef5);
        planVO.setVdef6(vdef6);

        /**
         * <组织>组
         */
        planVO.setPk_group(IParameter.Default_PKGroup);// 集团
        planVO.setPk_financeorg(pk_org);// 财务组织
        planVO.setPk_financeorg_v(pk_org_v);// 财务组织版本
        planVO.setPk_org(pk_org);// 财务组织
        planVO.setPk_org_v(pk_org_v);// 财务组织版本

        /**
         * <金额>组
         */
        planVO.setBalancemoney(new UFDouble(0));
        planVO.setBalancemoneyorg(new UFDouble(0));
        planVO.setNorikpmny(new UFDouble(0));
        planVO.setOrgmoney(vdef4);
        planVO.setPlanmoney(vdef4);
        planVO.setPlanrate(vdef2);// 付款比例 默认 100
        planVO.setUnconfpaymentorg(UFDouble.ZERO_DBL);// 未确认本币付款金额
        planVO.setUnconfpaymentori(UFDouble.ZERO_DBL);// 未确认原币付款金额

        /**
         * 封装VO
         */
        AggCtApVO aggVO = new AggCtApVO();
        aggVO.setParent(apVO);
        aggVO.setCtApBVO(ctApBVO);
        aggVO.setCtApPlanVO(new ISuperVO[]{planVO});

        return aggVO;
    }


    private AggCtApVO[] queryVO(JSONObject jsonObject) throws BusinessException{
        JSONObject apVO = jsonObject.getJSONObject("apVO");
        String vbillcode = apVO.getString("vbillcode");
        String fctApPK = DataInfoHelper.getFctApPK(vbillcode);
        String[] ids = new String[]{fctApPK};

        IApMaintain apMaintain = NCLocator.getInstance().lookup(IApMaintain.class);
        AggCtApVO[] aggCtApVOS = apMaintain.queryCtApVoByIds(ids);
        return aggCtApVOS;
    }

    /**
     * 保存合同
     * @param jsonAggVO
     * @return
     * @throws BusinessException
     */
    public void doSave(AggCtApVO jsonAggVO, JSONObject req, JSONObject resp) throws Exception
    {
        /**
         * 单据保存
         */
        AggCtApVO[] aggCtApVO = new AggCtApVO[]{jsonAggVO};
        AggCtApVO[] newAggCtApVO = NCLocator.getInstance().lookup(IApMaintain.class).save(aggCtApVO);


        /**
         * 文件上传
         */
        JSONObject response = new JSONObject();
        JSONObject request = new JSONObject();
        request.put("action", "FILE");
        request.put("apVO", req.getJSONObject("apVO"));
        request.put("fileVO", req.getJSONArray("fileVO"));

        this.uploadFile(newAggCtApVO, request, response);
        /***********************************************************************************/

        /**
         * 单据审核
         */
        this.approve(newAggCtApVO);

        /**
         * 生效
         */
        this.validate(newAggCtApVO);

        resp.put("issuccess", "Y");
        resp.put("msg", "合同新增成功");
    }

    public void uploadFile(AggCtApVO[] aggVO, JSONObject request, JSONObject response) {

        // 文件上传
        try {
            if (aggVO == null) {
                response.put("issuccess", "N");
                response.put("msg", "未查询到相关合同，文件上传失败");
            } else {
                AggCtApVO aggCtApVO = aggVO[0];
                CtApVO parentVO = aggCtApVO.getParentVO();
                String pk_fct_ap = parentVO.getPk_fct_ap();

                JSONArray fileArray = request.getJSONArray("fileVO");
                if (fileArray != null && fileArray.size() > 0) {
                    for (int i = 0; i < fileArray.size(); i++) {
                        JSONObject fileObject = fileArray.getJSONObject(i);
                        String fileName = fileObject.getString("fileName");
                        String base64Str = fileObject.getString("base64Str");
                        contractService.doUpload(pk_fct_ap, fileName, base64Str);
                    }
                    response.put("issuccess", "Y");
                    response.put("msg", "文件上传完成");
                } else {
                    response.put("issuccess", "Y");
                    response.put("msg", "未获取到附件信息");
                }
            }
        } catch (Exception e) {
            response.put("issuccess", "N");
            response.put("msg", e.getMessage());
        } finally {
            try {
                IWSDLLogger iLogger = NCLocator.getInstance().lookup(IWSDLLogger.class);// 日志接口
                UFDateTime serverTime = DataInfoHelper.getServerTime();// 服务器时间
                iLogger.saveLogger_RequiresNew(serverTime, request, response);
            } catch (BusinessException e) {
                throw new RuntimeException(e);
            }
        }
    }

    /**
     * 封装VO
     */
    private AggCtApVO buildChangeVO(JSONObject jsonObject) throws Exception {

        // 变更原因信息
        JSONObject changeObject = jsonObject.getJSONObject("changeVO");
        String vbillcode = DataInfoHelper.formatString(changeObject.get("vbillcode"));// 单据编号
        String vmemo = DataInfoHelper.formatString(changeObject.get("vmemo"));// 合同变更类别
        String vchgcontent = DataInfoHelper.formatString(changeObject.get("vchgcontent"));// 变更内容
        String vchgreason = DataInfoHelper.formatString(changeObject.get("vchgreason"));// 变更事由

        String sql = "SELECT pk_fct_ap FROM fct_ap WHERE vbillcode ='" + vbillcode + "' and version = '1' ";
        String pk_fct_ap = (String) this.getBaseDAO().executeQuery(sql, new ColumnProcessor());
        if (StringUtils.isBlank(pk_fct_ap)) {
            throw new BusinessException("未查询到["+vbillcode+"]相关合同信息");
        }

        /******************************************************************************************/

        // 变更内容
        JSONObject apObject = jsonObject.getJSONObject("apVO");
        String[] orgPKs =  DataInfoHelper.getOrgPKs(apObject.get("signorg"));
        String pk_org = orgPKs == null ? null : orgPKs[0];// 财务组织
        String pk_org_v = orgPKs == null ? null : orgPKs[1];// 财务组织版本

        // 承担部门
        String deptcode = "";
        String deptid = (String) apObject.get("deptid");
        if(StringUtils.isNotBlank(deptid)){
            deptcode = DataInfoHelper.getValueCode(deptid);
        }
        String[] deptPKs = DataInfoHelper.getDeptOrgPKs(deptcode, pk_org);
        String pk_dept = deptPKs == null ? null : deptPKs[0];// 部门
        String pk_dept_v = deptPKs == null ? null : deptPKs[1];// 部门版本

        String personnelid = DataInfoHelper.getPsndocPK(apObject.get("personnelid"));// 承办人
        String billmaker = DataInfoHelper.getUserPK(apObject.get("billmaker"));// 制单人
        String creater = DataInfoHelper.getUserPK(apObject.get("creatorId"));// 创建人
//        String vbillcode = DataInfoHelper.formatString(apObject.get("vbillcode"));// 单据编号
        String ctname = DataInfoHelper.formatString(apObject.get("ctname"));// 合同名称
        String projectId = DataInfoHelper.getProjectPK(apObject.get("projectId"));// 合同名称
        String cvendorid = DataInfoHelper.getSupplierPK(apObject.get("vbdef1"));// 供应商
        UFDouble mny = DataInfoHelper.formatUFDouble2(apObject.get("norigpshamount"));// 合同金额
        UFDouble taxAmount = DataInfoHelper.formatUFDouble2(apObject.get("taxAmount"));// 税额
        UFDouble overrate = DataInfoHelper.formatUFDouble2(apObject.get("overrate"));// 超合同付款比例
        UFDouble taxmny = mny.sub(taxAmount);// 不含税金额

        UFDate valdate = DataInfoHelper.formatUFDate(apObject.get("valdate"));// 计划生效日期
        UFDate invallidate = DataInfoHelper.formatUFDate(apObject.get("invallidate"));// 计划终止日期
        UFDate subscribedate = DataInfoHelper.formatUFDate(apObject.get("subscribedate"));// 签字盖章日期
        String corigcurrencyid = DataInfoHelper.getCurrtypePK(apObject.get("corigcurrencyid"));// 币种
        UFBoolean openct = DataInfoHelper.formatUFBoolean(apObject.get("openct"));// 是否敞口合同
        UFDate ratedate = DataInfoHelper.formatUFDate(apObject.get("ratedate"));// 组织汇率来源日期

        String vbdef1 = DataInfoHelper.formatString(apObject.get("vbdef1"));// 供应商
        String vbdef2 = DataInfoHelper.formatString(apObject.get("vbdef2"));// 供应商银行账户
        String vbdef3 = DataInfoHelper.formatString(apObject.get("vbdef3"));// 开户行

        String vdef10 = DataInfoHelper.formatString(apObject.get("vdef10"));// 合同所属方	文本
        String vdef11 = DataInfoHelper.formatString(apObject.get("vdef11"));// 采购方式	文本
        String vdef12 = DataInfoHelper.formatString(apObject.get("vdef12"));// 合同执行部门	部门
        String vdef13 = DataInfoHelper.formatString(apObject.get("vdef13"));// 分管领导	人员
        String vdef14 = DataInfoHelper.formatString(apObject.get("vdef14"));// 合同性质	文本
        String vdef15 = DataInfoHelper.formatString(apObject.get("vdef15"));// 项目信息	文本
        String vdef16 = DataInfoHelper.formatString(apObject.get("vdef16"));// 签订类型	文本
        String vdef17 = DataInfoHelper.formatString(apObject.get("vdef17"));// 合同类型	文本
        String vdef18 = DataInfoHelper.formatString(apObject.get("vdef18"));// 合同期限	文本
        String vdef19 = DataInfoHelper.formatString(apObject.get("vdef19"));// 合同情况说明	文本
        String vdef20 = DataInfoHelper.formatString(apObject.get("vdef20"));// 报告提交日期	日期
        String vdef21 = DataInfoHelper.formatString(apObject.get("vdef21"));// 是否包含耗材或配件	文本
        String vdef22 = DataInfoHelper.formatString(apObject.get("vdef22"));// 基建项目信息	文本
        String vdef23 = DataInfoHelper.formatString(apObject.get("vdef23"));// 概算信息	文本
        String vdef24 = DataInfoHelper.formatString(apObject.get("vdef24"));// 开工日期	日期
        String vdef25 = DataInfoHelper.formatString(apObject.get("vdef25"));// 竣工日期	日期
        String vdef26 = DataInfoHelper.formatString(apObject.get("vdef26"));// 租赁标的物	文本
        String vdef27 = DataInfoHelper.formatString(apObject.get("vdef27"));// 租赁地点/姓名	文本
        String vdef28 = DataInfoHelper.formatString(apObject.get("vdef28"));// 发生年度	文本
        String vdef29 = DataInfoHelper.formatString(apObject.get("vdef29"));// 解决方式	文本
        String vdef30 = DataInfoHelper.formatString(apObject.get("vdef30"));// 维保时间	日期
        String vdef36 = DataInfoHelper.formatString(apObject.get("vdef36"));// 病情简介	文本
        String vdef37 = DataInfoHelper.formatString(apObject.get("vdef37"));// 收入类型	文本
        String vdef38 = DataInfoHelper.formatString(apObject.get("vdef38"));// 项目经费来源	文本
        String vdef39 = DataInfoHelper.formatString(apObject.get("vdef39"));// 合同属性	文本
        String vdef40 = DataInfoHelper.formatString(apObject.get("vdef40"));// 预算价	文本
        String vdef41 = DataInfoHelper.formatString(apObject.get("vdef41"));// 节约比率	文本
        String vdef42 = DataInfoHelper.formatString(apObject.get("vdef42"));// 预算合理性	文本
        String vdef43 = DataInfoHelper.formatString(apObject.get("vdef43"));// 维保费率	文本
        String vdef44 = DataInfoHelper.formatString(apObject.get("vdef44"));// 结算比率	文本
        String vdef45 = DataInfoHelper.formatString(apObject.get("vdef45"));// 预算承担部门	部门
        String vdef46 = DataInfoHelper.formatString(apObject.get("vdef46"));// 预算类型	文本
        String vdef47 = DataInfoHelper.formatString(apObject.get("vdef47"));// 收支项目	费用项目
        String vdef48 = DataInfoHelper.formatString(apObject.get("vdef48"));// 预算信息	自定义档案：yusuanxx_yql
        String vdef49 = DataInfoHelper.formatString(apObject.get("vdef49"));// 三级项目名称2	项目
        String vdef50 = DataInfoHelper.formatString(apObject.get("vdef50"));// 二级项目名称	项目
        String vdef51 = DataInfoHelper.formatString(apObject.get("vdef51"));// 一级项目名称	项目
        String vdef52 = DataInfoHelper.formatString(apObject.get("vdef52"));// 二级项目名称2	项目
        String vdef53 = DataInfoHelper.formatString(apObject.get("vdef53"));// 一级项目名称2	项目
        String vdef54 = DataInfoHelper.formatString(apObject.get("vdef54"));// 经费类型	自定义档案：HRP002_yql

        /**
         * 引用类型转换
         */

        // 合同执行部门
        String vdef12Str = "";
        if(StringUtils.isNotBlank(vdef12) && vdef12.contains("_")){
            String code = DataInfoHelper.getValueCode(vdef12);
            String[] vdef12Dept = DataInfoHelper.getDeptOrgPKs(code, pk_org);
            vdef12Str = vdef12Dept == null ? null : vdef12Dept[0];// 部门
        }

        // 分管领导
        String vdef13Str = DataInfoHelper.getPsndocPK(vdef13);

        // 预算承担部门
        String vdef45Str = "";
        if(StringUtils.isNotBlank(vdef45) && vdef45.contains("_")){
            String code = DataInfoHelper.getValueCode(vdef45);
            String[] vdef45Dept = DataInfoHelper.getDeptOrgPKs(code, pk_org);
            vdef45Str = vdef45Dept == null ? null : vdef45Dept[0];// 部门
        }

        // 收支项目
        String vdef47Str = DataInfoHelper.getInOutBusiclassPK(vdef47, pk_org);

        // 预算信息
        String vdef48Str = DataInfoHelper.getDefYUSUANXX(vdef48, pk_org);

        // 项目
        String vdef49Str = DataInfoHelper.getProjectPK(vdef49);
        String vdef50Str = DataInfoHelper.getProjectPK(vdef50);
        String vdef51Str = DataInfoHelper.getProjectPK(vdef51);
        String vdef52Str = DataInfoHelper.getProjectPK(vdef52);
        String vdef53Str = DataInfoHelper.getProjectPK(vdef53);

        // 经费类型
        String vdef54Str = DataInfoHelper.getDefHRP002(vdef54, pk_org);


        IApMaintain apMaintain = NCLocator.getInstance().lookup(IApMaintain.class);
        AggCtApVO[] aggCtApVOS = apMaintain.queryCtApVoByIds(new String[]{pk_fct_ap});
        AggCtApVO aggCtApVO = aggCtApVOS[0];

        /******************************************************************************************/

        /**
         * 合同信息变更
         */
        CtApVO apVO = (CtApVO) aggCtApVO.getParent();
        UFDouble version = apVO.getVersion();
        UFDouble newVersion = version.add(new UFDouble(1.0));
        apVO.setVersion(newVersion);//更替版本号
        apVO.setPk_origct(pk_fct_ap);// ***** 绑定原始主键

        apVO.setCtname(ctname);// 合同名称
        apVO.setCtrantypeid(IParameter.Default_PKCtranType);// 合同类型
        apVO.setDbilldate(new UFDate());// 单据日期
        apVO.setValdate(valdate);// 计划生效日期
        apVO.setInvallidate(invallidate);// 计划终止日期
        apVO.setSubscribedate(subscribedate);// 签字盖章时间
        apVO.setCprojectid(projectId);
        apVO.setOverrate(overrate);// 超合同付款比例

        apVO.setCvendorid(cvendorid);// 供应商
        apVO.setCvendorid_v(cvendorid);// 供应商版本

        /**
         * <金额>
         */
        apVO.setNorigcopamount(new UFDouble(0));// 累计原币应付金额
        apVO.setNorigplanamount(new UFDouble(0));// 累计原币预付款金额
        apVO.setNorigpshamount(new UFDouble(0));// 累计原币付款金额
        apVO.setNorikpmny(new UFDouble(0));// 累计原币收票金额

        apVO.setNoriprepaymny(new UFDouble(0));// 预付款
        apVO.setNprepaymny(new UFDouble(0));// 本币预付款
        apVO.setNtotalcopamount(new UFDouble(0));// 累计本币应付金额
        apVO.setNtotalplanamount(new UFDouble(0));// 累计本币预付款金额
        apVO.setNtotalgpamount(UFDouble.ZERO_DBL);// 累计本币付款金额
        apVO.setNtotalastnum(UFDouble.ZERO_DBL);// 	总数量
        apVO.setNtotalorigmny(mny);// 原币价税合计
        apVO.setNtotaltaxmny(taxmny);// 本币价税合计

        apVO.setUnconfpayableorg(UFDouble.ZERO_DBL);// 未确认本币应付金额
        apVO.setUnconfpayableori(UFDouble.ZERO_DBL);// 未确认原币应付金额
        apVO.setUnconfpaymentorg(UFDouble.ZERO_DBL);// 未确认本币付款金额
        apVO.setUnconfpaymentori(UFDouble.ZERO_DBL);// 未确认原币付款金额

        /**
         * <组织>组
         */
        apVO.setOrganizer(pk_org);// 承办组织
        apVO.setOrganizer_v(pk_org_v);// 承办组织版本
        apVO.setPk_group(IParameter.Default_PKGroup);// 集团
        apVO.setPk_org(pk_org);// 财务组织
        apVO.setPk_org_v(pk_org_v);// 财务组织版本
        apVO.setSignorg(pk_org);// 签约组织
        apVO.setSignorg_v(pk_org_v);// 签约组织版本
        if(deptPKs != null){
            apVO.setDepid(pk_dept);// 申请部门
            apVO.setDepid_v(pk_dept_v);// 申请部门
        }
        apVO.setPersonnelid(personnelid);// 申请人

        /**
         * <其他>组
         */
        apVO.setCreationtime(new UFDateTime());// 创建时间
        apVO.setCreator(creater);// 创建人
        apVO.setBillmaker(billmaker);// 制单人
        apVO.setDmakedate(new UFDate());// 制单日期

        /**
         * <自定义>组
         */
        apVO.setVdef10(vdef10);// 合同所属方	文本
        apVO.setVdef11(vdef11);// 采购方式	文本
        apVO.setVdef12(vdef12Str);// 合同执行部门	部门
        apVO.setVdef13(vdef13Str);// 分管领导	人员
        apVO.setVdef14(vdef14);// 合同性质
        apVO.setVdef15(vdef15);// 项目信息	文本
        apVO.setVdef16(vdef16);// 签订类型	文本
        apVO.setVdef17(vdef17);// 合同类型	文本
        apVO.setVdef18(vdef18);// 合同期限	文本
        apVO.setVdef19(vdef19);// 合同情况说明	文本
        apVO.setVdef20(vdef20);// 报告提交日期	日期
        apVO.setVdef21(vdef21);// 是否包含耗材或配件	文本
        apVO.setVdef22(vdef22);// 基建项目信息	文本
        apVO.setVdef23(vdef23);// 概算信息	文本
        apVO.setVdef24(vdef24);// 开工日期	日期
        apVO.setVdef25(vdef25);// 竣工日期	日期
        apVO.setVdef26(vdef26);// 租赁标的物	文本
        apVO.setVdef27(vdef27);// 租赁地点/姓名	文本
        apVO.setVdef28(vdef28);// 发生年度	文本
        apVO.setVdef29(vdef29);// 解决方式	文本
        apVO.setVdef30(vdef30);// 维保时间	日期
//        apVO.setVdef31(vdef31);
//        apVO.setVdef32(vdef32);
//        apVO.setVdef33(vdef33);
//        apVO.setVdef34(vdef34);
        apVO.setVdef35(vdef10);// 合同所属方
        apVO.setVdef36(vdef36);// 病情简介	文本
        apVO.setVdef37(vdef37);// 收入类型	文本
        apVO.setVdef38(vdef38);// 项目经费来源	文本
        apVO.setVdef39(vdef39);// 合同属性	文本
        apVO.setVdef40(vdef40);// 预算价	    文本
        apVO.setVdef41(vdef41);// 节约比率	文本
        apVO.setVdef42(vdef42);// 预算合理性	文本
        apVO.setVdef43(vdef43);// 维保费率	文本
        apVO.setVdef44(vdef44);// 结算比率	文本
        apVO.setVdef45(vdef45Str);// 预算承担部门	部门
        apVO.setVdef46(vdef46);// 预算类型	文本
        apVO.setVdef47(vdef47Str);// 收支项目	费用项目
        apVO.setVdef48(vdef48Str);// 预算信息	自定义档案：yusuanxx_yql
        apVO.setVdef49(vdef49Str);// 三级项目名称2	项目
        apVO.setVdef50(vdef50Str);// 二级项目名称	项目
        apVO.setVdef51(vdef51Str);// 一级项目名称	项目
        apVO.setVdef52(vdef52Str);// 二级项目名称2	项目
        apVO.setVdef53(vdef53Str);// 一级项目名称2	项目
        apVO.setVdef54(vdef54Str);// 经费类型	自定义档案：HRP002_yql
//        apVO.setVdef55(vdef55);
        apVO.setVdef56(vdef11);// 采购方式

        /**
         * 变更历史
         */
        CtApChangeVO changeVO = new CtApChangeVO();
        changeVO.setStatus(VOStatus.NEW);// 新增
        changeVO.setDr(0);// 删除标志
        changeVO.setPk_fct_ap(apVO.getPk_fct_ap());
        changeVO.setPk_org(apVO.getPk_org());
        changeVO.setPk_org_v(apVO.getPk_org_v());
        changeVO.setPk_group(apVO.getPk_group());
        changeVO.setVchgdate(new UFDate());
        changeVO.setVchgpsn("1001A2100000000282KF");// 变更人
        changeVO.setVchangecode(version);
        changeVO.setVmemo(vmemo);
        changeVO.setVchgcontent(vchgcontent);
        changeVO.setVchgreason(vchgreason);
        aggCtApVO.setChildrenVO(new CtApChangeVO[]{changeVO});
        return aggCtApVO;
    }


    /**
     * 变更合同
     * @param jsonAggVO
     * @return
     * @throws BusinessException
     */
    public void doModify(AggCtApVO jsonAggVO, JSONObject resp) throws BusinessException
    {
        /**
         * 单据修改
         */
        AggCtApVO[] aggCtApVO = new AggCtApVO[]{jsonAggVO};
        AggCtApVO[] newAggCtApVO = NCLocator.getInstance().lookup(IApApprove.class).modify(aggCtApVO, null);

        /**
         * 单据审核
         */
        this.approve(newAggCtApVO);

        /**
         * 生效
         */
        this.validate(newAggCtApVO);

        resp.put("issuccess", "Y");
        resp.put("msg", "合同变更成功");
    }

    /******************************************************************************************************/

    /**
     * 审核APPROVE
     *
     * @param aggCtApVO
     * @return
     * @throws BusinessException
     */
    public void approve(AggCtApVO[] aggCtApVO) throws BusinessException
    {
        /**
         * 调用审核脚本
         */
        IplatFormEntry iplatFormEntry = NCLocator.getInstance().lookup(IplatFormEntry.class);
        HashMap<String, Object> hmPfExParams = new HashMap<String, Object>();
        hmPfExParams.put(PfUtilBaseTools.PARAM_NOFLOW, PfUtilBaseTools.PARAM_NOFLOW);// 不发送消息

        try {
            iplatFormEntry.processAction("APPROVE", IDataType.FCT_AP, null, aggCtApVO[0],null,
                    hmPfExParams);
        } catch(Exception e) {
            throw new BusinessException("单据审批失败，错误描述：" + e.getMessage());
        }
    }

    /**
     * 生效VALIDATE
     *
     * @param aggCtApVO
     * @throws BusinessException
     */
    public void validate(AggCtApVO[] aggCtApVO) throws BusinessException
    {
        /**
         * 调用审核脚本
         */
        IplatFormEntry iplatFormEntry = NCLocator.getInstance().lookup(IplatFormEntry.class);
        HashMap<String, Object> hmPfExParams = new HashMap<String, Object>();
        hmPfExParams.put(PfUtilBaseTools.PARAM_NOFLOW, PfUtilBaseTools.PARAM_NOFLOW);// 不发送消息

        try {
            iplatFormEntry.processAction("VALIDATE", IDataType.FCT_AP, null, aggCtApVO[0],null,
                    hmPfExParams);
        } catch(Exception e) {
            throw new BusinessException("单据审批失败，错误描述：" + e.getMessage());
        }
    }

    /**
     * 从request中获取接口数据
     * @param request 接口请求
     * */
    private String readRequest(HttpServletRequest request) throws Exception {
        InputStreamReader insr = new InputStreamReader(request.getInputStream(), "utf-8");
        StringBuffer result = new StringBuffer();
        int respInt = insr.read();
        while (respInt != -1) {
            result.append((char) respInt);
            respInt = insr.read();
        }
        if (result.length() < 1) {
            throw new BusinessException("未获取到请求体信息，请检查！");
        }
        return result.toString();
    }

    /**
     * 登录nc系统
     */
    private void loginNcSystem() {
        NCLocator.getInstance().lookup(ISecurityTokenCallback.class)
                .token("NCSystem".getBytes(), "pfxx".getBytes());
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doAction(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doAction(req, resp);
    }
}
